#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{
	int pipefdTest[2];
	char strBuff[1024] = {0};
	int iCnt = 0;
	int iRet = 0;

	iRet = pipe( pipefdTest );
	if( iRet == -1 )
	{
		perror( "fail pipe in 01_pipe.c" );
		return -1;
	}

	char strWriteBuff[] = "ABC";
	iRet = write( pipefdTest[1], strWriteBuff, sizeof(strWriteBuff) );
	if ( iRet == -1 )
	{
		perror( "fail write<1> in 01_pipe.c" );
	}
	printf( "Total Write #%d bytes\n", iRet );		


	// 测试关闭 读通道 之后, 再向pipe中写入, 会导致管道破裂, 程序直接崩溃
	close( pipefdTest[0] );
	iRet = write( pipefdTest[1], strWriteBuff, sizeof(strWriteBuff) );
	if ( iRet == -1 )
	{
		perror( "fail write<2> in 01_pipe.c" );
	}
	printf( "Total Write #%d bytes\n", iRet );			
	 
	return 0;
}




/*
所涉及函数
	pipe()
	wirte()
	read()
	close()

标号0 PipeRead
标号1 PipeWrite

PipeWrite  PipeRead  操作   结果

至少一个	至少一个    写    如果缓存区没有写满, 直接写入
                           如果缓存区已经写满, 阻塞等待直到有数据读出

至少一个    至少一个    读    如果缓存区有数据,   直接读出
                           如果缓存区没有数据, 阻塞等待直到有数据写入

至少一个    0          写    管道立刻破裂, 产生管道破裂信号SIGPIPE, 进程异常结束

0          至少一个    读    如果缓存区有数据, 直接读出
                           如果缓存区没有数据, 不会阻塞等待, 直接返回读到0个数据



*/